#整数类型（int）
from lib2to3.fixes.fix_input import context

from matplotlib.pyplot import connect

age=18
print('年龄是:',age,'。数据类型是:',type(age))

#浮点数类型（float）
price=3.14
print('价格是:',price,'。数据类型是:',type(price))
print('价格是:%.2f'%price)
print('价格是'+str(price)+"元\斤") #加号是连接符，不能连接不同类型的数据

#复数类型（complex）
a=4+5j
b=complex(2,3)
print('a的值是:',a,'。数据类型是:',type(a))
print('b的值是:',b,'。数据类型是:',type(b))

#小数类型（decimal）
print(0.3 + 0.3 + 0.3 + 0.1)
print(0.3 - 0.1 - 0.1 - 0.1 )
#这二个结果是不一样的，因为浮点数的精度问题，不能对浮点数进行精确的计算

#所以我们可以使用小数类型来解决这个问题
from decimal import Decimal
print(Decimal('0.3') + Decimal('0.3') + Decimal('0.3') + Decimal('0.1'),'数据类型是:',type(Decimal('0.3')))
print(Decimal('0.3') - Decimal('0.1') - Decimal('0.1') - Decimal('0.1'),'数据类型是:',type(Decimal('0.3')))
#小数类型的数据是不能和其他类型的数据进行运算的，只能和小数类型的数据进行运算
Decimal(price)#将浮点数转换为小数
print(type(Decimal(price)))

#小数类型的全局精度只有28位，如果超过28位，会报错
#可使用decimal模块中的上下文对象来设置小数的全局精度。首先调用decimal模块的getcontext()函数获得当前模块中的上下文对象，再通过上下文对象的prec属性设置小数的全局精度。
from decimal import * #导入decimal模块中的所有内容
a=Decimal('0.1')/Decimal('0.3') #用默认精度也就是28位计算
print(a)

context=getcontext() #获得当前模块中的上下文对象
context.prec=5 #设置小数的全局精度为5
print(Decimal('0.1')/Decimal('0.3'))#用设置的精度计算

#也可以通过print输出格式来设置小数的精度
print('%.4f'%(Decimal('0.1')/Decimal('0.3')))
#或者.format()方法
print('{:.4f}'.format(Decimal('0.1')/Decimal('0.3')))


#小数的临时精度
#除了设置全局精度，还可以设置小数的临时精度，只在当前运算中有效
a=Decimal('0.1')/Decimal('0.3')
print(a)

#调用decimal模块的localcontext()函数返回本地上下文对象，再通过本地上下文对象的prec属性设置小数点的临时精度
with localcontext() as local:
    local.prec=3
    a=Decimal('0.1')/Decimal('0.3')
    print(a)

#只在with语句块中有效，在with语句块外，小数的精度仍然是全局精度
a=Decimal('0.1')/Decimal('0.3')
print(a)

#分数类型Fraction
#分数使用fractions模块中的Fraction()函数来创建
from fractions import Fraction
x=Fraction(2,8)
print(x,'数据类型是:',type(x))
print(Fraction(1,4)+2)
